package com.yjlove.myplay.common;
import android.content.Context;
import android.os.Looper;
import android.util.Log;
import com.yjlove.myplay.utils.FileAndImageUtil;
import java.io.File;
import java.io.FileOutputStream;

/**
 * 作者 YJlvoe
 * 创建时间 2017/3/29.
 */
public class CrashHandler implements Thread.UncaughtExceptionHandler {
    /**
     * 是否开启日志输出，在debug状态下开启
     * 在release状态下关闭以提示程序性能
     */
    public static final boolean DEBUG = true;
    /**
     * 系统默认的UncaughtException处理类
     */
    private String mPath = StringPath.LOG_PATH;
    private Thread.UncaughtExceptionHandler mDefaultHandler;
    private static CrashHandler INSTANCE;
    private CrashHandler(){}
    public static CrashHandler getInstance() {
        if (INSTANCE == null) {
            INSTANCE = new CrashHandler();
        }
        return INSTANCE;
    }
    /**
     * 初始化,注册Context对象,
     * 获取系统默认的UncaughtException处理器,
     * 设置该CrashHandler为程序的默认处理器
     *
     * @param ctx
     */
    public void init(Context ctx) {
        mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        if (!handleException(ex) && mDefaultHandler != null) {
            //如果用户没有处理则让系统默认的异常处理器来处理
            mDefaultHandler.uncaughtException(thread, ex);
        } else {  //如果自己处理了异常，则不会弹出错误对话框，则需要手动退出app
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(10);
        }
    }
    /**
     * 自定义错误处理,收集错误信息
     * 发送错误报告等操作均在此完成.
     * 开发者可以根据自己的情况来自定义异常处理逻辑
     * @return
     * true代表处理该异常，不再向上抛异常，
     * false代表不处理该异常(可以将该log信息存储起来)然后交给上层(这里就到了系统的异常处理)去处理，
     * 简单来说就是true不会弹出那个错误提示框，false就会弹出
     */
    private boolean handleException(final Throwable ex){
        if(ex == null){
            return false;
        }
        final StackTraceElement[] stack = ex.getStackTrace();
        final String message = ex.getMessage();
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                String fileName = "crash.log";
                FileAndImageUtil.createFile(mPath, fileName);
                File file = new File(mPath, fileName);
                Log.e("path", mPath + "/myapp/");
                try {
                    FileOutputStream fos = new FileOutputStream(file,true);
                    fos.write(message.getBytes());
                    for (int i = 0; i < stack.length; i++) {
                        fos.write(stack[i].toString().getBytes());
                    }
                    fos.flush();
                    fos.close();
                } catch (Exception e) {

                }
                Looper.loop();
            }

        }.start();
        return false;
    }
}